﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using App.Modelo;
using App.Modelo.Attributes;
using App.Modelo.Interfaces;
using App.Persistencia;
using App.SolInf.Controlador;
using App.SolInf.Modelo;
using App.SolInf.Reportes;
using App.SolInf.Vista.Listado;

namespace App.SolInf.Vista
{
    [Formulario("Compras")]
    public partial class DetalleCompra : Form
    {
        private Compra _compra;
        public ModoFormularioABM Modo = ModoFormularioABM.Modificacion;
        public Repositorio Repositorio;

        private ControladoraProveedores _controladoraProveedores;
        public ControladoraProveedores ControladoraProveedores
        {
            get
            {
                return _controladoraProveedores ??
                       (_controladoraProveedores =
                        ModuloSolInf.Instance.FabricaControladoras.Factory<ControladoraProveedores>());
            }
            set
            {
                _controladoraProveedores = value;
            }
        }

        private ControladoraCompras _controladoraCompras;
        public ControladoraCompras ControladoraCompras
        {
            get
            {
                return _controladoraCompras ??
                       (_controladoraCompras =
                        ModuloSolInf.Instance.FabricaControladoras.Factory<ControladoraCompras>());
            }
            set
            {
                _controladoraCompras = value;
            }
        }
        
			
        public DetalleCompra()
        {
            InitializeComponent();
        }

        public Compra Compra
        {
            get { return _compra; }
            set
            {
                compraBindingSource.DataSource = _compra = value;

                if (value != null)
                {
                    lineaCompraBindingSource.DataSource = value.Lineas;
                }
            }
        }
        
        [Comando("alta")]
        public void Alta()
        {
            Modo = ModoFormularioABM.Alta;
            Repositorio = new Repositorio();
            Compra = new Compra();
            ModuloSolInf.Instance.AbrirFormulario(this);
        }

        public void Modificar()
        {
            Modo = ModoFormularioABM.Modificacion;
            ModuloSolInf.Instance.AbrirFormulario(this);
        }

        private void btnCrearLineaPresupuesto_Click(object sender, EventArgs e)
        {
            var crearLineaPresupuesto = new CrearLineaVenta();
            crearLineaPresupuesto.Closed += new EventHandler(crearLineaPresupuesto_Closed);
            
            crearLineaPresupuesto.AltaCompra(new LineaCompra());
        }

        void crearLineaPresupuesto_Closed(object sender, EventArgs e)
        {
            var form = (CrearLineaVenta)sender;
            if (form.DialogResult == DialogResult.OK)
            {
                lineaCompraBindingSource.Add(form.LineaVenta);
            }
        }

        private void btnBuscarProveedor_Click(object sender, EventArgs e)
        {
            var listadoProveedor = new ListadoProveedor()
            {
                BotonCancelar = true,
                BotonSeleccionar = true,
                ControladoraProveedores = ControladoraProveedores
            };

            listadoProveedor.ItemSelected += new EventHandler<Git.Vista.Widgets.ListadoBusquedaItemEventArgs>(listadoProveedor_ItemSelected);
            listadoProveedor.BuscarElemento();
        }

        void listadoProveedor_ItemSelected(object sender, Git.Vista.Widgets.ListadoBusquedaItemEventArgs e)
        {
            Compra.Proveedor = (Proveedor) e.ItemSeleccionado;
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            if (Modo == ModoFormularioABM.Alta)
            {
                try
                {
                    ControladoraCompras.Alta(Compra);

                    MessageBox.Show("Se dio de alta la Compra", Text);

                    var m = ControladoraCompras.GetMovimientoStock(Compra);
                    
                    new DetalleMovimientoStockReporte().Ver(m.Id);
                    Close();
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }


        public void Ver()
        {
            Modo = ModoFormularioABM.Ver;
            grpDerecha.Visible = grpAbajo.Visible = false;
            grpProveedor.Enabled = grpDocumentacion.Enabled = false;
            ModuloSolInf.Instance.AbrirFormulario(this);
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            Close();
        }


        private void btbModiLinea_Click(object sender, EventArgs e)
        {
            if (dgLineas.SelectedRows.Count >= 1)
            {
                foreach (DataGridViewRow row in dgLineas.SelectedRows)
                {
                    var itemSeleccionado = (ILineaVenta)row.DataBoundItem;
                    var modiLineaPresupuesto = new CrearLineaVenta();
                    modiLineaPresupuesto.Closed += new EventHandler(modiLineaPresupuesto_Closed);

                    modiLineaPresupuesto.Alta(itemSeleccionado);
                }
            }
            else
            {
                MessageBox.Show("Debe seleccionar un item");
            }
        }

        void modiLineaPresupuesto_Closed(object sender, EventArgs e)
        {
        }

        private void btnBajaLinea_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Seguro que desea eliminar?", Text, MessageBoxButtons.YesNo) == DialogResult.No)
                return;

            if (dgLineas.SelectedRows.Count < 1)
                MessageBox.Show("Debe seleccionar un item");

            foreach (DataGridViewRow row in dgLineas.SelectedRows)
                lineaCompraBindingSource.Remove(row.DataBoundItem);


        }

        private void IngresarCompra_Load(object sender, EventArgs e)
        {
            buscarEmpresa1.Empresas = ControladoraProveedores.Listar().Cast<Empresa>();
        }

        
    }
}
